6장. 자료 찾아 붙이고, 스스로 일하기 (RAG와 에이전트)

출처: 『AI 엔지니어링』(Chip Huyen 지음) | 원서: AI Engineering (O'Reilly) — 본 입문판은 PDF 원문에서 직접 풀어 썼다.

코드는 분위기만 — Python·함수 이름 같은 건 몰라도 됩니다. '비유'와 '위험'만 봐도 충분해요.


0. 이 장의 새 단어 (0장에 없는 것만 3개)

이 셋만 알면 6장은 다 읽힌다.

나머지 어려운 말(임베딩·RAG·환각 등)은 0장 용어집에 있다.


청크(chunk)

한 문장 뜻 — 긴 문서를 검색하기 좋게 잘라 놓은 한 조각.

일상비유 — 두꺼운 책을 통째로 복사하는 대신, 필요한 쪽만 뜯어 두는 것. 한 쪽이 곧 청크다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 긴 문서를 작은 조각으로 자름
chunks = split("계약서 전문...", size=500)  # 500자씩 한 조각

에이전트(agent)

한 문장 뜻 — 주변을 살펴보고(읽기) 직접 행동까지(쓰기) 하는 AI. 모델에 손발을 달아 준 것.

일상비유 — 시키면 알아서 일하는 비서. 검색도 하고, 계산기도 두드리고, 메일도 보낸다. 그냥 답만 하는 챗봇과 다르다.

한 줄 예 —

# 그냥 답하는 게 아니라, 도구를 골라 행동까지 함
# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
agent.run("이번 주 환율로 40파운드를 킬로로 바꿔줘")

도구(tool)

한 문장 뜻 — 에이전트가 부려 쓰는 외부 기능. 검색기·계산기·메일 보내기 같은 것.

일상비유 — 비서 책상 위의 연장통. 계산기, 전화기, 메모장. 연장이 많을수록 더 많은 일을 한다.

한 줄 예 —

# 모델은 수학에 약함 → 계산기 도구를 쥐여 줌
# `tools`에 중간 결과를 담아 다음 줄에서 재사용합니다.
tools = [calculator, web_search, send_email]

이런 적 있죠?

AI한테 "우리 회사 환불 규정 알려줘"라고 물었다.

그런데 AI는 우리 회사를 모른다. 학습할 때 본 적이 없으니까.

그래서 그럴듯한 거짓 규정을 지어낸다(환각).

사람도 똑같다. 정보가 없으면 헛소리를 한다.

그럼 어떻게 할까? 답하기 전에 규정 문서를 찾아서 같이 던져 주면 된다.

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 답하기 전에 관련 자료를 먼저 찾아 붙임
docs = search("환불 규정")           # ① 자료 검색
model.ask("환불 규정 알려줘", docs)   # ② 자료 보고 답

이렇게 "찾아서 붙여 주는" 방식이 RAG다.

여기서 한 발 더 나가면, 검색만 하는 게 아니라 계산도 하고 메일도 보내는 비서가 된다.

그게 에이전트다.

이 장은 이 둘 이야기다.


이 장에서 딱 4가지만

  1. RAG — 답하기 전에 관련 자료를 찾아 붙여 준다. 모델이 모르는 걸 알게 만든다.
  2. 검색의 두 방식 — 단어가 똑같은 걸 찾기(빠름) vs 뜻이 비슷한 걸 찾기(똑똑함).
  3. 에이전트 — 모델에 도구(손발)를 달아 스스로 행동하게 한다.
  4. 메모리 — 방금 들은 것(단기)과 오래된 자료(장기)를 나눠서 기억한다.

학습 목표

  • RAG가 왜 필요한지 설명한다.
  • 단어 기반 검색과 의미 기반 검색을 구분한다.
  • 에이전트가 그냥 챗봇과 어떻게 다른지 설명한다.
  • 단기 메모리와 장기 메모리를 구분한다.

개념 1 — RAG: 답하기 전에 자료를 찾아 붙인다

망가지는 장면

"신제품 A300 프린터 사양을 물었더니, AI가 없는 숫자를 술술 지어냈다."

모델은 그 제품을 학습한 적이 없다. 그래서 환각이 났다.

일상비유

오픈북 시험.

머리로만 답하면 틀린다.

답안지 옆에 자료집을 펴 놓고 찾아보며 쓰면 정답률이 확 오른다.

RAG는 모델에게 자료집을 펴 주는 일이다.

비유 코드 위험
머리로만 답함(폐쇄책 시험) model.ask("A300 사양?") 모르면 지어냄(환각)
자료 펴 놓고 답함(오픈북) model.ask("A300 사양?", docs) 자료를 잘못 찾으면 헛답

한 문장 정의 — RAG는 질문마다 관련 자료를 찾아 컨텍스트에 붙여 주는 방식이며, 모델을 고치지 않고도 모르는 것을 알게 만든다.

왜 굳이? — "그냥 다 넣으면 안 되나?"

요즘 모델은 긴 글도 받는다.

그럼 자료를 전부 넣으면 되지 않나?

안 된다. 두 가지 이유다.

  1. 자료는 계속 늘어난다. 아무리 길게 받아도 언젠간 넘친다.
  2. 길게 넣을수록 모델이 엉뚱한 데를 본다. 게다가 길면 비용도 시간도 더 든다.

RAG는 꼭 필요한 자료만 골라 넣어서, 싸고 빠르고 정확하게 만든다.

한 걸음 더 ▸ (지금 몰라도 됨)

Anthropic은 "자료가 약 500쪽(20만 토큰) 미만이면 RAG 없이 그냥 다 넣어도 된다"고 했다.

즉 자료가 적으면 RAG가 굳이 필요 없다. 많아질 때 빛난다. 지금은 "많으면 골라 넣는다"만 기억하면 된다.

예시 폭격

예시 1 (완성예) — 고객 지원 챗봇.

질문 "비밀번호 어떻게 바꿔요?" → 매뉴얼에서 비밀번호 관련 쪽을 찾아 붙임 → 정확히 답.

# 질문과 가까운 문서 조각을 찾아오는 검색 단계를 실행합니다.
docs = search("비밀번호 변경")
# 준비한 함수나 객체를 호출해 예제의 핵심 동작을 실행합니다.
model.ask("비밀번호 어떻게 바꿔요?", docs)

예시 2 (부분완성) — 빈칸을 채워 보자.

법률 상담 봇이 판례를 지어내지 않게 하려면?

docs = search("____")          # 빈칸: 무엇을 검색할까? → 질문 속 사건명
# 준비한 함수나 객체를 호출해 예제의 핵심 동작을 실행합니다.
model.ask("이 사건 판례 있어?", docs)

답: 질문에 나온 사건 키워드를 검색한다. 그래야 진짜 판례만 붙는다.

예시 3 (독립적용) — 직접 떠올려 보자.

"우리 팀 회의록에서 지난주 결정사항 알려줘"라는 질문에 RAG를 쓰면, 무엇을 search 하고 무엇을 붙여 줄까?

(힌트: 회의록 문서를 검색해 관련 청크를 붙인다.)


개념 2 — 검색의 두 방식: 단어가 같은가, 뜻이 비슷한가

망가지는 장면

"'트랜스포머 아키텍처'를 검색했더니 영화 '트랜스포머'랑 전기 변압기 문서가 나왔다."

단어만 같으면 다 끌어왔기 때문이다.

일상비유

도서관에서 책 찾기.

방법 A — 제목에 그 단어가 있는 책만 뽑기. 빠르지만 멍청하다.

방법 B — 사서에게 "이런 내용"이라 말하면 뜻이 맞는 책을 골라 줌. 똑똑하지만 느리다.

비유 코드 위험
단어 똑같은 것만(방법 A) find_word("트랜스포머") 뜻 다른 게 섞임(변압기·영화)
뜻이 비슷한 것(방법 B) find_meaning("AI 신경망 구조") 느리고 비쌈

한 문장 정의 — 단어 기반 검색은 글자 모양이 같은 걸 찾고(빠름·저렴), 의미 기반 검색은 임베딩으로 뜻이 가까운 걸 찾는다(똑똑함·비쌈).

(임베딩이 헷갈리면 0장 용어집 "임베딩" 칸을 보면 된다. 뜻을 좌표로 바꿔 가까운 걸 찾는 것이다.)

단순 규칙

처음엔 단어 기반(BM25)부터 써라. 빠르고 공짜에 가깝고, 그냥 잘 된다.

이걸 기준선으로 삼고, 부족하면 의미 기반을 얹는다.

한 걸음 더 ▸ (지금 몰라도 됨)

실제 현장은 둘을 섞는다(하이브리드 검색).

단어 기반으로 후보를 싹 긁고, 그 안에서 의미 기반으로 진짜 맞는 걸 다시 고른다(재순위화).

지금은 "단어부터, 부족하면 의미 추가"만 알면 된다.

예시 폭격

예시 1 (완성예, before/after) — 오류 코드 검색.

before: 의미 기반만 쓰니 EADDRNOTAVAIL(99) 코드가 뭉개져서 안 찾힘.

after: 단어 기반을 같이 쓰니 코드를 글자 그대로 정확히 찾음.

예시 2 (부분완성) — 어느 방식이 맞을까?

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 질문: "트랜스포머 아키텍처 설명한 자료"
# → 단어가 같아도 뜻이 다른 게 많음 → ____ 기반 검색이 유리

답: 의미 기반. 뜻으로 골라야 영화·변압기를 걸러낸다.

예시 3 (독립적용) — 직접 골라 보자.

"제품 코드 SKU-7782 들어간 주문"을 찾는다면, 단어 기반과 의미 기반 중 어느 쪽이 나을까? 왜?

(힌트: 정확한 코드 글자 매칭이 필요하다.)


개념 3 — 에이전트: 모델에 손발을 달아 준다

망가지는 장면

"AI한테 199999 나누기 292를 물었더니 틀린 답을 자신만만하게 내놨다."

모델은 글을 잇는 기계지, 계산기가 아니다(0장 척추 1).

일상비유

손 없는 천재 vs 비서.

천재가 암산은 잘하는데 손이 없어 메일도 못 보내고 계산기도 못 누른다.

여기에 연장통(도구)을 쥐여 주면, 검색하고 계산하고 메일까지 보내는 비서가 된다.

그게 에이전트다.

비유 코드 위험
그냥 답만 함(챗봇) model.ask("40파운드는 몇 kg?") 수학·최신정보에 약함
도구 쥐고 행동함(에이전트) agent.run(...) → 계산기 호출 도구 잘못 쓰면 사고

한 문장 정의 — 에이전트는 환경을 살펴보고(읽기) 도구로 행동까지(쓰기) 하는 AI이며, 어떤 환경에서 어떤 도구를 쥐느냐로 정해진다.

도구는 크게 세 종류

  • 자료 가져오기 — 검색기, 웹 브라우징, 사내 DB. 모르는 걸 알게 함.
  • 약점 메우기 — 계산기, 번역기, 코드 실행기. 모델이 못하는 걸 대신함.
  • 행동하기(쓰기) — 메일 보내기, DB 수정, 송금. 진짜 세상을 바꿈.

단순 규칙

도구가 많을수록 능력은 커진다. 하지만 너무 많으면 오히려 헷갈려 한다.

그래서 꼭 필요한 도구만 신중히 골라 쥐여 준다.

특히 "행동하기" 도구는 조심해야 한다.

한 걸음 더 ▸ (지금 몰라도 됨)

왜 조심? 인턴에게 회사 DB 삭제 권한을 안 주는 것과 같다.

믿을 수 없는 AI에 송금 권한을 주면, 한 번 헛돌 때 피해가 크다.

그래서 위험한 행동은 사람이 먼저 승인하게 만든다. 지금은 "쓰기 도구는 위험, 승인 필요"만 알면 된다.

작은 사고가 쌓이면 큰 사고

에이전트는 여러 단계를 거친다.

한 단계 정확도가 95%여도, 10단계면 약 60%, 100단계면 0.6%로 무너진다.

그래서 단계를 줄이고, 더 똑똑한 모델을 쓰고, 중간중간 스스로 점검(성찰)하게 한다.

예시 폭격

예시 1 (완성예) — 단위 변환.

"40파운드는 몇 kg?" → 모델이 직접 계산하면 틀릴 수 있음 → 계산기 도구 호출 → 정확.

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 모델이 "이건 계산기로!"라고 판단해 도구를 부름
agent.run("40파운드는 몇 kg?")  # → lbs_to_kg(40) 호출

예시 2 (부분완성) — 어떤 도구가 필요할까?

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# "오늘 서울 날씨 알려줘"
# 모델 학습은 과거에 멈춤 → 오늘 날씨를 모름 → ____ 도구 필요

답: 웹 검색(자료 가져오기) 도구. 최신 정보는 검색해야 안다.

예시 3 (독립적용) — 직접 분류해 보자.

"이 고객에게 사과 메일 보내줘"는 세 도구 종류 중 무엇일까? 왜 조심해야 할까?

(힌트: 진짜로 메일이 나가는 "행동하기" 도구다.)


개념 4 — 메모리: 방금 들은 것과 오래된 것을 나눈다

망가지는 장면

"AI 비서한테 매번 내 이름과 취향을 처음부터 다시 설명해야 한다. 어제 말한 걸 다 까먹는다."

기억할 곳이 없으면 비서는 쓸모가 없다.

일상비유

사람의 기억.

  • 숨 쉬는 법은 안 잊는다 → 몸에 밴 지식.
  • 방금 만난 사람 이름은 잠깐만 기억 → 단기 기억.
  • 오래된 자료는 책·메모장에 적어 둠 → 장기 기억(필요할 때 꺼내 봄).

AI 메모리도 똑같이 셋으로 나뉜다.

비유 코드 위험
몸에 밴 지식(안 잊음) model.weights 바꾸려면 재학습 필요
방금 들은 것(잠깐) context = 최근 대화 자리가 꽉 차면 밀려남
메모장에 적어 둠(꺼내 봄) long_term = search(과거기록) 검색 잘못하면 못 꺼냄

한 문장 정의 — AI 메모리는 모델에 밴 내부 지식, 지금 대화만 담는 단기 메모리, 외부에 적어 두고 찾아 쓰는 장기 메모리로 나뉜다.

단순 규칙

지금 작업에 바로 필요한 건 단기에.

가끔 필요한 오래된 건 장기에 적어 두고 꺼내 쓴다.

장기 메모리는 사실 RAG와 똑같다. 외부에 두고 검색해 오니까.

한 걸음 더 ▸ (지금 몰라도 됨)

단기 메모리는 자리가 좁아서 꽉 차면 뭔가 버려야 한다.

가장 단순한 방법은 오래된 것부터 버리기(FIFO). 하지만 첫 메시지에 중요한 목적이 있으면 낭패다.

더 똑똑한 방법은 대화를 요약해 압축하는 것. 지금은 "단기는 좁다, 넘치면 장기로"만 알면 된다.

예시 폭격

예시 1 (완성예) — 책 추천 비서.

사용자가 전에 '삼체'를 좋아했다고 장기 메모리에 적어 둠 → 다음에 비슷한 SF를 추천.

예시 2 (부분완성) — 어디에 저장할까?

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# "방금 사용자가 말한 배송 주소" → 지금 작업에만 필요 → ____ 메모리

답: 단기 메모리. 이번 주문이 끝나면 굳이 안 들고 있어도 된다.

예시 3 (독립적용) — 직접 나눠 보자.

"이 사용자는 채식주의자"라는 정보는 단기와 장기 중 어디에 둘까? 왜?

(힌트: 다음에 또 만나도 기억해야 하는 정보다.)


정리

자료를 찾아 붙이면 모델이 모르는 걸 알게 된다(RAG).

검색은 단어가 같은 걸 빠르게 찾거나, 뜻이 가까운 걸 똑똑하게 찾는다.

모델에 도구를 쥐여 주면 스스로 행동하는 에이전트가 되고, 기억할 곳을 나눠 주면 더 똑똑해진다.

세 가지 공통점: 모델 자체는 안 고치고, 입력만 잘 챙겨서 능력을 키운다.


더 해보기


다음 7장 예고 — 지금까지는 모델을 안 고치고 입력만 챙겼다. 다음엔 모델 자체를 우리 데이터로 조금 더 가르치는 법(파인튜닝)을 본다. (지금 몰라도 됩니다.)


연습문제

  1. 설명. 자료 찾아 붙이고 스스로 일하기의 핵심을 처음 듣는 사람에게 한 문장으로 설명하라.
  2. 구분. 두 개념(RAG, 에이전트)을 실제 예시 하나로 구분하라.
  3. 적용. 내 프로젝트나 학습 노트에서 이 장의 개념을 적용해 작게 개선할 지점을 하나 고르라.

부록 A. 쉬운 용어 사전

용어 아주 쉬운 뜻 이 장에서 나온 위치
RAG 답변할 때 관련 자료를 찾아 붙여 모델이 근거를 보고 답하게 하는 방식. 부록 B와 본문 예시
에이전트 모델이 도구를 고르고 여러 단계를 진행하게 만든 구조. 부록 B와 본문 예시
짧은 기억 현재 대화 안에서만 잠시 유지되는 정보. 부록 B와 본문 예시
긴 기억 나중에도 다시 쓰기 위해 저장하는 정보. 부록 B와 본문 예시

부록 B. 헷갈리는 개념 비교표

A B 구분 포인트
RAG 에이전트 RAG는 자료를 찾아 붙이고, 에이전트는 도구 사용과 반복 판단까지 한다.
짧은 기억 긴 기억 짧은 기억은 현재 대화, 긴 기억은 나중에도 다시 쓸 정보다.

부록 C. 더 읽을 자료

  • 이 장의 더 해보기 섹션 — 이미 모아 둔 공식 문서나 실습 링크가 있으면 여기서 먼저 확인한다.
  • 같은 책의 0장 한눈에 보기 — 용어가 막히면 0장의 용어집과 개념 척추로 돌아간다.
  • 원본 딥다이브판 같은 장 — 입문판을 읽고 큰 흐름이 잡힌 뒤 세부 논리를 더 깊게 확인한다.
  • 이 장의 flashcards.json — 읽은 직후 질문만 보고 답을 떠올리는 회상 연습에 쓴다.

부록 D. 연습문제 풀이

  1. 설명 예시. 자료 찾아 붙이고 스스로 일하기는 거대 모델을 제품에 넣을 때 어떤 선택을 하고 어떻게 확인할지 판단하게 해 주는 장이다. 중요한 것은 용어를 외우는 것이 아니라, 이 개념이 어떤 입력·부품·결정에 영향을 주는지 말로 풀어 보는 것이다.
  2. 구분 예시. 두 개념(RAG, 에이전트)의 차이는 이렇게 잡으면 된다. RAG는 자료를 찾아 붙이고, 에이전트는 도구 사용과 반복 판단까지 한다. 실제 사례를 볼 때는 목적, 입력, 실패했을 때의 증상을 따로 적어 보면 헷갈리지 않는다.
  3. 적용 예시. 가장 작은 개선부터 고른다. 예를 들어 이름을 더 분명히 하거나, 평가 기준을 한 줄 추가하거나, 직접 알 필요 없는 내부 정보를 감추는 식으로 시작한다. 한 번에 크게 갈아엎는 것보다 작은 변경 하나를 확인하며 진행하는 쪽이 입문 단계에 맞다.
난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플